package com.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * jwt工具类
 * 实现token的生成和校验
 *
 * @author a0112
 * @date 2022/04/17
 */
public class JWTUtils {
    public static final long EXPERING_TIME = 24*60*60*1000;
    /**
     * 生成一个token，其中放入了用户名和加密后的密码
     *
     * @param username  通过claim放入token中
     * @param password
     * @return 生成的token字符串
     */
    public static String sign(String username,String password){
        //对密码进行加密
        Algorithm algorithm = Algorithm.HMAC256(password);
        //设置过期时间
        Date expering_time = new Date(System.currentTimeMillis() + EXPERING_TIME);
        String token = JWT.create().withClaim("username", username)
                .withSubject(username)
                .withExpiresAt(expering_time)
                .sign(algorithm);
        return token;
    }
    /**
     * 校验token
     *
     * @param token 需要校验的token
     * @param username 加密放入的用户名
     * @param password 加密用的签名
     * @return boolean
     */
    public static boolean verify(String token,String username,String password){
        Algorithm algorithm = Algorithm.HMAC256(password);
        JWTVerifier jwtVerifier = JWT.require(algorithm)
                .withClaim("username",username)
                .withSubject(username).build();
        jwtVerifier.verify(token);
        return true;
    }
    /**
     * 从token中取出username
     *
     * @param token
     * @return
     */
    public static String getUsername(String token){
        DecodedJWT decode = JWT.decode(token);
        return decode.getSubject();
    }
}
